package DAO;

import DTO.UsuarioDTO;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
import models.Usuario;

/**
 * Clase que implementa las operaciones CRUD y demas metodos basicos para
 * manipular los usuarios del sistema.
 * @author eagle_eye
 */
public class UsuarioDAO implements GeneralDAO<Usuario, Integer> {

    private EntityManagerFactory emf;
    private EntityManager em;

    public UsuarioDAO(EntityManagerFactory emf) {
        this.emf = emf;
        em = emf.createEntityManager();
    }

    @Override
    public void create(Usuario entity) {
        em.getTransaction().begin();
        try {
            em.persist(entity);
            em.getTransaction().commit();
        } catch (Exception e) {
            e.printStackTrace();
            em.getTransaction().rollback();
            System.out.println("Error al crear Usuario");
        } finally {
            em.close();
            closeEmf();
        }
    }

    @Override
    public void update(Usuario entity) {
        em.getTransaction().begin();
        try {
            em.merge(entity);
            em.getTransaction().commit();
        } catch (Exception e) {
            e.printStackTrace();
            em.getTransaction().rollback();
            System.out.println("Error al actualizar al Usuario");
        } finally {
            em.close();
            closeEmf();
        }
    }

    @Override
    public void delete(Usuario entity) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    /**
     * Metodo que permite que un usuario se loguee en la Base de Datos.
     * @param user
     * @param passwd
     * @return true si fue exitosa la opercion, false en otro caso.
     */
    public UsuarioDTO login(String user) {
        UsuarioDTO usuarioDTO = null;
        try {
            Query q1 = em.createNamedQuery("Usuario.findByNombreUsuario");
            q1.setParameter("nombreUsuario", user);
            List<Usuario> lista = q1.getResultList();
            if (lista.isEmpty()) {
                usuarioDTO = null;
            } else {
                usuarioDTO = new UsuarioDTO();
                usuarioDTO.setIdUsuario(lista.get(0).getIdUsuario());
                usuarioDTO.setUsuario(lista.get(0).getNombreUsuario().toString());
                usuarioDTO.setPassword(lista.get(0).getClave().toString());
                usuarioDTO.setTipousuario(lista.get(0).getTipoUsuarioId().getIdTipoUsuario());
            }
        } catch (Exception e) {
            System.out.println("Error en Login de usuario");
        } finally {
            em.close();
            closeEmf();
        }
        return usuarioDTO;
    }

    /**
     * Metodo que cierra EntityManagerFactory
     */
    private void closeEmf() {
        emf.close();
    }
}
